package org.pz.camunda.service;

import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.repository.Deployment;
import org.camunda.bpm.model.bpmn.BpmnModelInstance;
import org.camunda.bpm.model.bpmn.instance.Definitions;
import org.camunda.bpm.model.bpmn.instance.UserTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Collection;

/**
 * 流程部署相关
 * */
@Slf4j
@Component
public class DeployService {

    /**
     * spring-boot-camunda 提供的 service，用来创建流程
     * */
    @Autowired
    private RepositoryService repositoryService;

    /**
     * 部署流程，会生成 deployment（部署） 和 process（流程定义）
     * */
    public void deploy(String resourceName, String name) {
        // 创建部署对象
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource(resourceName) // 添加资源路径
                .name(name) // 设置部署名称
                .deploy(); // 部署流程定义
    }

    /**
     * 删除部署，会删除 deployment（部署） 和 process（流程定义）
     * */
    public void undeploy(String deploymentId) {
        repositoryService.deleteDeployment(deploymentId);
    }

    /**
     * 获取流程模型实例，也就是 java 版本的 BPMN，可以理解为一个 process java 表示
     * 这个 processDefinitionId 是 process 的 definition Id
     * */
    public BpmnModelInstance getBpmnModelInstance(String processDefinitionKey) {
        // 获取流程模型实例
        BpmnModelInstance bpmnModelInstance = repositoryService.getBpmnModelInstance(processDefinitionKey);

        if (bpmnModelInstance != null) {
            // 获取模型中的所有用户任务
            Collection<UserTask> userTasks = bpmnModelInstance.getModelElementsByType(UserTask.class);
            // 获取模型定义
            Definitions definitions = bpmnModelInstance.getDefinitions();
            // 日志输出
            log.info("获取到流程模型实例：{}", bpmnModelInstance);
        }

        return bpmnModelInstance;
    }
}
